package com.sxyjhh.utils.result;

import com.sxyjhh.utils.page.PageBean;
import com.sxyjhh.utils.util.JsonDateChangeUtil;
import com.sxyjhh.utils.util.ResultCodeEnum;
import com.sxyjhh.utils.util.XaUtil;
import net.sf.json.JSONArray;

import java.util.Collection;
import java.util.HashMap;

public class ResultMap extends HashMap{
    //私有化构造方法
    private ResultMap(){}

    /**
     * 封装分页结果数据信息
     * @param pageBean
     * @return
     */
    public static ResultMap getPageResultMap(PageBean pageBean){
        ResultMap result  = new ResultMap();
        if(XaUtil.isNotEmpty(pageBean)){
            result.put("total",pageBean.getTotalResult());
            result.put("rows", JsonDateChangeUtil.collectionChange(pageBean.getResultList()));
        }else{
            result.put("total",0);
            result.put("rows", new JSONArray());
        }
        return result;
    }

    /**
     * 封装返回信息
     * @param codeEnum 状态码枚举
     * @return
     */
    public static ResultMap getResultMap(ResultCodeEnum codeEnum){
        ResultMap result  = new ResultMap();
        result.put("code",codeEnum.name());
        result.put("msg",result.getMagByCodeEnum(codeEnum));
        return result;
    }

    /**
     * 封装返回信息
     * @param msg 返回信息描述
     * @param codeEnum 状态码枚举
     * @return
     */
    public static ResultMap getResultMap(String msg,ResultCodeEnum codeEnum){
        ResultMap result  = new ResultMap();
        result.put("code",codeEnum.name());
        if(XaUtil.isNotEmpty(msg)){
            result.put("msg",msg);
        }else{
            result.put("msg",result.getMagByCodeEnum(codeEnum));
        }
        return result;
    }

    /**
     * 返回结果封装
     * @param msg 返回信息描述
     * @param codeEnum 状态码枚举
     * @param data 数据
     * @param isChangeDate 是否转化数据中的日期
     * @return
     */
    public static ResultMap getResultMap(String msg,ResultCodeEnum codeEnum,Object data,boolean isChangeDate){
        ResultMap result  = new ResultMap();
        result.put("code",codeEnum.name());
        if(XaUtil.isNotEmpty(msg)){
            result.put("msg",msg);
        }else{
            result.put("msg",result.getMagByCodeEnum(codeEnum));
        }

        //如果需要对数据进行日期格式转换
        if(null != data && isChangeDate){
            if (data instanceof Collection) {
                if (((Collection) data).size() == 0) {
                    result.put("data",new JSONArray());
                }else{
                    result.put("data", JsonDateChangeUtil.collectionChange((Collection) data));
                }
            }else{
                result.put("data", JsonDateChangeUtil.objChange(data));
            }
        }else{
            result.put("data",data);
        }
        return result;
    }

    /**
     * 返回结果封装
     * @param codeEnum 状态码枚举
     * @param data 数据
     * @param isChangeDate 是否转化数据中的日期
     * @return
     */
    public static ResultMap getResultMap(ResultCodeEnum codeEnum,Object data,boolean isChangeDate){
        ResultMap result  = new ResultMap();
        result.put("code",codeEnum.name());
        result.put("msg",result.getMagByCodeEnum(codeEnum));

        //如果需要对数据进行日期格式转换
        if(null != data && isChangeDate){
            if (data instanceof Collection) {
                if (((Collection) data).size() == 0) {
                    result.put("data",new JSONArray());
                }else{
                    result.put("data", JsonDateChangeUtil.collectionChange((Collection) data));
                }
            }else{
                result.put("data", JsonDateChangeUtil.objChange(data));
            }
        }else{
            result.put("data",data);
        }
        return result;
    }

    /**
     * 通过状态码获取返回信息
     * @param codeEnum
     * @return
     */
    private String getMagByCodeEnum(ResultCodeEnum codeEnum){
        String msg = null;
        switch (codeEnum){
            case code_200:
                msg = "查询成功。";
                break;
            case code_201:
                msg = "创建或修改成功。";
                break;
            case code_202:
                msg = "已接受请求，但尚未处理。";
                break;
            case code_203:
                msg="已成功处理了请求，但返回的信息可能来自另一来源。";
                break;
            case code_204:
                msg = "成功处理了请求，但操作对象不存在。";
                break;
            case code_206:
                msg="成功处理了部分请求。";
                break;
            case code_400:
                msg="请求错误，服务器不理解请求的语法格式。";
                break;
            case code_401:
                msg="操作未授权，请进行身份验证。";
                break;
            case code_403:
                msg="服务器拒绝处理该操作。";
                break;
            case code_404:
                msg="访问的资源不存在。";
                break;
            case code_405:
                msg="禁用请求中指定的方法。";
                break;
            case code_406:
                msg="无法使用请求的内容特性响应请求。";
                break;
            case code_408:
                msg="请求超时";
                break;
            case code_409:
                msg="服务器在完成请求时发生冲突。";
                break;
            case code_410:
                msg="请求的资源已删除";
                break;
            case code_411:
                msg="需要有效长度";
                break;
            case code_412:
                msg="未满足前提条件";
                break;
            case code_413:
                msg="请求实体过大";
                break;
            case code_415:
                msg="不支持的媒体类型。";
                break;
            case code_500:
                msg="服务器内部错误。";
                break;
            case code_501:
                msg="服务器不具备完成请求的功能。";
                break;
            case code_502:
                msg="服务器充当网关或代理，从上游服务器收到无效响应。";
                break;
            case code_503:
                msg="由于超载或停机维护，服务器目前无法使用。";
                break;
            case code_504:
                msg="网关超时。";
                break;
            case code_505:
                msg="不支持请求中所用的 HTTP 协议版本。";
                break;
            default:
                msg="";
        }
        return msg;
    }
}
